package com.example.springbootdaydayup.config;

import com.zaxxer.hikari.HikariDataSource;
import org.beetl.sql.core.ClasspathLoader;
import org.beetl.sql.core.Interceptor;
import org.beetl.sql.core.UnderlinedNameConversion;
import org.beetl.sql.core.db.MySqlStyle;
import org.beetl.sql.ext.DebugInterceptor;
import org.beetl.sql.ext.spring4.BeetlSqlDataSource;
import org.beetl.sql.ext.spring4.SqlManagerFactoryBean;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.Environment;

import javax.sql.DataSource;


@Configuration
public class SimpleDataSourceConfig {

    /* 使用HikariDataSource 数据库连接池*/
    @Bean(name="datasource")
    public DataSource datasource(Environment env) {
        HikariDataSource ds = new HikariDataSource();
        ds.setJdbcUrl(env.getProperty("spring.datasource.url"));
        ds.setUsername(env.getProperty("spring.datasource.username"));
        ds.setPassword(env.getProperty("spring.datasource.password"));
        ds.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
        return ds;
    }


     //@Primary：自动装配时当出现多个Bean候选者时，被注解为@Primary的Bean将作为首选者
    //sqlManager工厂bean
    @Bean(name = "sqlManagerFactoryBean")
    @Primary
    public SqlManagerFactoryBean getSqlManagerFactoryBean(@Qualifier("datasource") DataSource datasource) {
        SqlManagerFactoryBean factory = new SqlManagerFactoryBean();

        //绑定数据库连接池
        BeetlSqlDataSource source = new BeetlSqlDataSource();
        source.setMasterSource(datasource);

        //数据源
        factory.setCs(source);

        //指定数据库使用mysql
        factory.setDbStyle(new MySqlStyle());

        // 最后，创建一个SQLManager,DebugInterceptor 不是必须的，但可以通过它查看sql执行情况
        //注释掉这行就不会打印 sql信息了
        factory.setInterceptors(new Interceptor[]{new DebugInterceptor()});

        // 数据库命名跟java命名一样，所以采用DefaultNameConversion，还有一个是UnderlinedNameConversion，下划线风格的，
        factory.setNc(new UnderlinedNameConversion());//开启驼峰命名

        // sql语句放在classpagth的/sql 目录下
        factory.setSqlLoader(new ClasspathLoader("/sql"));//sql文件路径
        return factory;
    }







}